package com.wtgroup.demo.leetcode.q005_最长回文子串;

/**
 * @author nisus
 * @version 0.1
 * @since 2023/5/17 10:31
 */
public class D_暴力2 {

    /*
     自己摸索的另一种暴力解法 -- 类似中心扩散思想
     往后遍历, 每个"单核"和"双核"都尝试验证, 验证过了, 计入结果
     核的左右两边对称观察
     */
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
        char[] chars = s.toCharArray();
        int N = chars.length;

        int[] ans = new int[2];
        for (int i = 0; i < N; i++) {
            char c = chars[i];

            {
                int l, r = i;
                int[] ans1 = new int[]{i, r};
                // 单核, 当前自身
                ans1[0] = l = i;
                for (l--,r++; r < N && l >= 0; l--, r++) {
                    if (chars[l] != chars[r]) {
                        break;
                    }
                }
                ans1 = new int[]{l + 1, r - 1};
                if (ans1[1] - ans1[0] > ans[1] - ans[0]) {
                    ans = ans1;
                }
            }

            if (i - 1 >= 0 && chars[i - 1] == c) {
                int l, r = i;
                int[] ans1 = new int[]{i, r};
                // 双核
                ans1[0] = l = i - 1;
                for (l--,r++; r < N && l >= 0; l--, r++) {
                    if (chars[l] != chars[r]) {
                        break;
                    }
                }
                ans1 = new int[]{l + 1, r - 1};
                if (ans1[1] - ans1[0] > ans[1] - ans[0]) {
                    ans = ans1;
                }
            }


        }

        int len = ans[1] - ans[0] + 1;
        return len == 0 ? "" : new String(chars, ans[0], len);
    }

}
